home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
dev
/
asm
/
Asm_Course2.lha
/
Teil25.TXT
< prev
next >
Wrap
Text File
|
1993-09-01
|
14KB
|
422 lines
A S S E M B L E R - K U R S (c) Jeff Kandle 1990
25.Teil...
So, noch ein paar Tips zum TDD und dann gehts weiter.
Ihr koennt natuerlich auch gepackte Files auf die Disk `Tracken`, und sie
dann von dem TDD einladen lassen. Ich will mal kurz erklaeren wie da mit
Bytekiller-Files gemacht wird.
1. Demo/Intro packen.
2. Gepacktes File in den Speicher laden.
3. Ohne Hunks wieder abspeichern
4. Mit Amon auf die Disk Tracken.
5. TDD Bootblock schreiben.
Beim Bytekiller ist es so das die Decrunchroutine PC-Relativ geschrieben
ist, und deshalb ueberall laeuft. Ihr koennt sie deshalb ueberall hinladen.
Ausser halt dahin wo das entpackte liegt.
Ich habe mir angewoehnt meine Intro`s immer erst ab $38000 zu beginnen.
Dann habe ich immer knapp 100 KB zur verfuegung um darin das gepackte unter
zu kriegen.
Beim Bytekiller speziell sieht es so aus das die ersten 34 Bytes,
Hunk_Codes sind. Deshalb muesst ihr wenn ihr das File geladen habt, mit dem
Abspeichern um 34 Bytes spaeter beginnen.
Beispiel:
Ihr habt das vom CLI lauffaehige Intro nach $40000 geladen, dann muestt ihr
es ab $40022 abspeichern. Dann faengt es genau mit dem ersten Befehl der
Entpackroutine an.
Das mit dem Tracken muesst ihr dann selber ausrechnen. Bitte denkt daran,
das ihr auch bei der Laenge auf die naechste 512($200) Byte aufrunden
muesst. Bei anderen Werten kann es schwierigkeiten geben.
Wenn ihr euch jetzt ein bisschen mit der Bootblock-Programmierung
beschaeftigt, dann empfehle ich euch das Studium der Librarys. Die
Funktionen sind zwar sehr langsam, aber da wir ja nicht grosses machen ist
es ganz nuetzlich sie zu kennen. Denn so ein Aufruf zu einer bestimmten
Funktion ist sicherlich kuerzer als wie wenn man diese Funktion selber in
den Bootblock schreibt.
Ich habe auf einer Diske noch einen Bootblock-Source gefunden. Er zeigt was
man wenn man ein bisschen geschickt programmiert, alles mit dem Bootblock
anstellen kann.
Ich habe den Source ein bisschen Editiert, aber nur die Befehle selber
verrueckt und das ganze der lesbarkeit halber etwas auseinander gezogen.
Den Rest habe ich so gelassen, denn wer einen solche Bootblock schreiben
kann, der verdient es das man ihn erwaehnt.
Hier erstmal der Source...
ORG $40000
LOAD $40000
Bootblock:
dc.b "DOS",0
dc.l 0
dc.l $00000370
; Library Addressen und Offsets
Execbase= 4
OldOpenLibrary= -408
InitBitMap= -390
InitRastPort= -198
ClearScreen= -48
RectFill= -306
FindResident= -96
ScrollRaster= -396
Text= -60
; ChipAddressen
OffsetBase= $dff000
VPOSR= $6
DMACON= $96
BPL1MOD= $108
BPL2MOD= $10a
DIWSTRT= $8E
DIWSTOP= $90
; Konstanten
SETCLR= $8000
DMAEN= $100
DIWSTRTV= 44
DIWSTRTH= 129
DIWSTOPV= 244
DIWSTOPH= 193
; Hardware Register
LeftMouseButton= $bfe001
; Tabellen
RastPort= $70000
BitMap= $70200
Copperlist= $7a000
JumpAddr= $6c
Start: movem.l d0-d7/a0-a6,-(sp) ; Alle Register auf Stack retten
; graphics.library oeffnen
Move.l execbase,A6
Lea Gfxlibname(PC),A1
Jsr OldOpenLibrary(A6) ;Graphics Library oeffnen
Move.l D0,A6 ;Gfxbase nach A6
; Bildschirm Variable initialisieren
Lea OffsetBase,A0
Move.w #SETCLR+DMAEN,DMACON(A0)
Move.w #6,BPL1MOD(A0)
Move.w #6,BPL2MOD(A0)
Move.w #DIWSTRTV*$100+DIWSTRTH,DIWSTRT(A0)
Move.w #DIWSTOPV*$100+DIWSTOPH,DIWSTOP(A0)
; Init Copperlist
Lea Copperlist,A0
Move.l #$00e00005,(A0)+ ; MOVE $5 -> BPL1PTH
Move.l #$00e29000,(A0)+ ; MOVE $9000 -> BPL1PTL
Move.l #$01001200,(A0)+ ; MOVE 1 -> BPU0 & 1 -> COLOR
Move.l #$01800000,(A0)+ ; MOVE 0 -> COLOR0
Move.l #$01820000,(A0)+ ; MOVE 0 -> COLOR1
Lea Copperlist,A0
Move.l A0,50(A6) ; GfxBase+50
; BitMap initialisieren
Lea BitMap,A0 ; BitMap
Move.w #1,D0 ; depth
Move.w #368,D1 ; width
Move.w #220,D2 ; height
Jsr InitBitMap(A6)
Move.l #$58e62,BitMap+8 ; erstes BitPlane
; RastPort initialisieren
Lea RastPort,A1 ; rastport
Jsr InitRastPort(A6)
Move.l #BitMap,RastPort+4 ; BitMap Addresse -> RastPort
Jsr ClearScreen(A6) ; Bildschirm loeschen
; Kaestchen in die Copperliste schreiben
Lea Copperlist+20,A0 ; Ende der Copperliste -> A0
Move.w #175,D7
Move.l #$2c09fffe,D5 ; WAIT 8, 44
EinsVertikal:
Move.l D5,D0
Move.w #15,D6
Horizontalline:
Move.l D0,(A0)+
Move.l #$1800000,(A0)+ ; MOVE $000 -> COLOR0
Addi.l #$e0000,D0 ; WAIT Oldx+15, Oldy
Dbf D6,Horizontalline
Addi.l #$1000000,D5 ; WAIT 8, Oldy+1
Dbf D7,EinsVertikal
Move.l #28,D7 ; Kaestchenhoehe = 10
Lea Textscrollfeld(PC),A4
AppendCopList:
Move.l (A4)+,(A0)+ ; Scrollfeld malen anhaengen
Dbf D7,AppendCopList
; The P.R.O.F.I. auf BitMap malen
Lea BobTab(PC),A5
Move.w #30,D7 ; The PROFI = 31 Vierecke
InitBob:
Lea RastPort,A1 ; RastPort
Clr.l D0 ; xl
Clr.l D1 ; yl
Clr.l D2 ; xu
Clr.l D3 ; yu
Move.b (A5)+,D0 ; xl
Addi.w #25,D0 ; xl+25
Move.b (A5)+,D1 ; yl
Move.b (A5)+,D2 ; xu
Addi.w #25,D2 ; xu+25
Move.b (A5)+,D3 ; yu
Jsr RectFill(A6)
Dbf D7,InitBob
; Farbtabelle spiegeln auf 44 Farben
Lea Farbtabelle(PC),A0
Lea Farbtabelle+80(PC),A1
Move.w #20,D7
SpiegelFarbtabelleLoop3:
Move.w (A0)+,-(A1)
Dbf D7,SpiegelFarbtabelleLoop3
Lea Dummy(PC),A0
Move.l JumpAddr,2(A0) ; -> jmp ($6c)
Lea TextScrollen(PC),A0
Move.l A0,JumpAddr ; -> jmp Textscrollen
Mainloop:
; Farben in die Copperliste eintragen
Move.w #21,D7
Lea Copperlist+26,A0
Lea Farbtabelle(PC),A5
Move.w (A5),-8(A0)
FCLop0: Move.w #7,D4
FCLop1: Move.l A5,A1
Move.w #15,D6
FCLop2: Move.w (A1)+,(A0)
Addq.l #8,A0
Dbf D6,FCLop2
Dbf D4,FCLop1
Addq.l #2,A5
Dbf D7,FCLop0
; Farbtabelle rotieren
Lea Farbtabelle(PC),A0
Lea Farbtabelle+2(PC),A1
Move.w #38,D0
Move.w (A0),D1 ; farbe0 -> dummy
RotateFarbtabelle:
Move.w (A1)+,(A0)+
Dbf D0,RotateFarbtabelle
Move.w D1,-(A1) ; dummy -> farbe44
; Warten bis Elektronenstrahl in Zeile 64 ist (WaitTOF)
WaitTOF:
Cmpi.b #64,OffsetBase+VPOSR
Bls.s WaitTOF
Btst #6,LeftMouseButton ; Mousebutton gedrueckt
Bne.s MainLoop ; falls nein -> Mainloop
; Programm beenden
Lea Dummy+2(PC),A0
Move.l (A0),JumpAddr
Lea Dummy+10(PC),A1
Move.l #$20646f73,(A1) ; " dos"
Movem.l (sp)+,d0-d7/a0-a6
Lea Dummy+11(PC),A1 ; Name = dos.library
Jsr FindResident(A6)
Move.l D0,A0
Move.l 22(A0),A0
Clr.l D0
Rts
TextScrollen:
Movem.l d0-d7/a0-a6,-(sp)
Lea RastPort,A1 ; RastPort
Move.w #1,D0 ; dx
Clr.w D1 ; dy
Clr.w D2 ; minx
Move.w #198,D3 ; miny
Move.w #351,D4 ; maxx
Move.w #206,D5 ; maxy
Jsr ScrollRaster(A6)
Lea Scrolltext-2(PC),A0
Subi.b #1,(A0)
Bne.s Bra2
Move.b #9,(A0)
Lea Scrolltext-1(PC),A0
Eori.b #1,(A0)
Lea RastPort,A1
Move.w #320,36(A1) ; Current Pen Position x
Move.w #205,38(A1) ; Current Pen Position y
Lea AktBuchstabe(PC),A2
Addq.b #1,(A2)
Cmpi.b #Textende-Scrolltext,(A2) ;Anzahl der Buchstaben
Bne.s PrintBuchstabe
Clr.b (A2)
PrintBuchstabe:
Lea Scrolltext(PC),A0
Adda.w -1(A2),A0 ; string
Move.l #1,D0 ; count
Jsr Text(A6) ; A1=RastPort
Bra2: Lea Copperlist+6,A1
Lea Scrolltext-1(PC),A0
; Scrollen des grossen Schriftzueges
; er wird durch veraendern der HintergrundBitmap Startaddresse
; gescrollt.
Tst.b (A0)
Beq.s Scrollrunter
Addi.w #46,(A1) ; Scrollwert * 46
Bra.s Hochgescrollt
Scrollrunter:
Subi.w #46,(A1) ; Scrollwert * 46
Hochgescrollt:
Movem.l (sp)+,d0-d7/a0-a6
Dummy: Jmp $ffffffff
Gfxlibname:
dc.b "graphics.library",0
AktBuchstabe:
dc.b $ff
Farbtabelle:
dc.w $005,$006,$007,$008,$009,$00a,$00b,$00c,$00d,$00e,$00f
dc.w $50f,$60f,$70f,$80f,$90f,$a0f,$b0f,$c0f,$d0f,$e0f,$f0f
TextScrollFeld:
dc.l $dc09fffe ; WAIT 8, 220
dc.l $00e2b058 ; MOVE $b058 -> BPL1PTL
dc.l $01800aaf ; MOVE $aaf -> COLOR0
dc.l $de09fffe ; WAIT 8, 222
dc.l $0180086f ; MOVE $86f -> COLOR0
dc.l $e609fffe ; WAIT 8,230
dc.l $01820fff ; MOVE $fff -> COLOR1
dc.l $e709fffe ; WAIT 8,231
dc.l $01820fdd ; MOVE $fdd -> COLOR1
dc.l $e809fffe ; WAIT 8,232
dc.l $01820fcc ; MOVE $fbb -> COLOR1
dc.l $e909fffe ; WAIT 8,233
dc.l $01820faa ; MOVE $faa -> COLOR1
dc.l $ea09fffe ; WAIT 8,234
dc.l $01820f99 ; MOVE $f99 -> COLOR1
dc.l $eb09fffe ; WAIT 8,235
dc.l $01820f77 ; MOVE $f77 -> COLOR1
dc.l $ec09fffe ; WAIT 8,236
dc.l $01820f66 ; MOVE $f55 -> COLOR1
dc.l $ed09fffe ; WAIT 8,237
dc.l $01820f44 ; MOVE $f33 -> COLOR1
dc.l $ee09fffe ; WAIT 8,238
dc.l $01820f33 ; MOVE $f11 -> COLOR1
dc.l $ef09fffe ; WAIT 8,239
dc.l $01820f00 ; MOVE $f00 -> COLOR1
dc.l $f609fffe ; WAIT 8, 246
dc.l $0180042f ; MOVE $42f -> COLOR0
dc.l $f809fffe ; WAIT 8, 248
dc.l $01800000 ; MOVE $000 -> COLOR0
BobTab:
dc.b 65,80,105,90 ; T 1
dc.b 80,90,90,120 ; T 2
dc.b 110,80,120,120 ; H 3
dc.b 120,95,140,105 ; H 4
dc.b 140,80,150,120 ; H 5
dc.b 155,85,165,115 ; E 6
dc.b 160,80,195,90 ; E 7
dc.b 165,95,185,105 ; E 8
dc.b 160,110,195,120 ; E 9
dc.b 0,130,35,140 ; P 10
dc.b 30,135,40,150 ; P 11
dc.b 10,145,35,155 ; P 12
dc.b 0,145,10,170 ; P 13
dc.b 45,160,55,170 ; Punkt 14
dc.b 60,130,95,140 ; R 15
dc.b 90,135,100,150 ; R 16
dc.b 60,145,95,155 ; R 17
dc.b 60,155,70,170 ; R 18
dc.b 90,155,100,170 ; R 19
dc.b 105,160,115,170 ; Punkt 20
dc.b 120,135,130,165 ; O 21
dc.b 125,130,155,140 ; O 22
dc.b 150,135,160,165 ; O 23
dc.b 125,160,155,170 ; O 24
dc.b 165,160,175,170 ; Punkt 25
dc.b 180,135,190,170 ; F 26
dc.b 185,130,220,140 ; F 27
dc.b 190,145,210,155 ; F 28
dc.b 215,160,225,170 ; Punkt 29
dc.b 230,130,240,170 ; I 30
dc.b 245,160,255,170 ; Punkt 31
dc.b 1
dc.b 0
ScrollText:
dc.b "K-Seka Assembler Diskette von The P.R.O.F.I. "
dc.b "many greetings to ICI "
TextEnde:
Hiermit moechte ich das Thema Bootblock, endgueltig beenden. Hab wieder
viel zu viel geschrieben. Aber es ist halt auch eine interressante Sachen.
Der Bootblock ist etwas woran man Programmierer messen kann. Denn dort ist
der Platz sehr begrenzt, und man muss mit alle Haken und Oesen arbeiten.
Dort wird sich auch noch mehr tun.
Es ist nur schade das es Leute gibt die dieses koennen, kurz zu
Programmieren dafuer benutzen einen Virus zu schreiben.
Ich gebe zu das ich mich auch schon damit beschaeftigt habe. Ich habe auch
schon einen Kleinen Virus selber gemacht, aber eben nur zu testzwecken. Ich
habe dabei gemerkt das es wirklich schwer ist etwas so perfekt zu
programmieren wie die Viren neuerer Generation, wie z.b den Butonic, oder
den Revenge-Lamer. Aber wenn man so etwas kann gibt es einem noch lange
nicht das Recht anderen den Spass zu verderben.
Deshalb bitte ich die Leute unter euch die bald besser programmieren
lernen, und die Finessen des Amigas kennenlernen, doch bitte vom
Virenschreiben abzusehen.
Naja, ich will jetzt keinen Moralischen kriegen, aber das gehoert auch
dazu..
Schoenen Tag noch....
Jeff Kandle